c++ - Clang、std::next、libstdc++ 和 constexpr-ness
全部标签 我有一个类,它基本上是一个队列,用于在2个线程之间传输动态分配的对象。第一个线程创建对象,第二个线程使用它们。我使用std::unique_ptr将对象所有权从线程1传递到线程2。实际上调用将对象放入队列的方法是这样的:queue.put(std::move(unique_ptr_to_my_object));和签名:boolQueue::put(std::unique_ptrp);问题是put()方法必须检查一些条件来决定是否可以将对象添加到队列中。如果条件为假,则该方法简单地返回false以指示它无法将对象添加到队列中,但该对象已被销毁,因为所有权已被put()获取。所以我想知道这
我在我的C++代码中定义了is_string:#includetemplatestructis_string{staticconstboolvalue=false;};templatestructis_string>{staticconstboolvalue=true;};intmain(){std::cout::value::value对于std::string和std::wstring都是如此。但我需要这样的谓词:is_string::value//tobetrueis_string::value//tobefalseis_string::value//tobefalseis_st
我知道std::set不允许非常量访问它的项。我知道不可能将项目移出集合——因为任何类型的非常量访问都可能破坏集合的顺序。但是,我们可以从集合中删除一个项目。这不会破坏它,因为它只是迫使集合进行重组。那么为什么我们不能“弹出”一个项目呢?为什么我不能取出项目并同时将其删除?我问的原因是-我需要一个有序的unique_ptrs容器。有时我需要从一个容器中“弹出”unique_ptr并将它们转移到另一个容器中。它们必须是我制作的自定义仿函数。我不明白为什么不允许弹出功能? 最佳答案 要从std::set中提取节点,您可以使用extrac
有没有办法解决以下问题:此代码生成C4702警告“无法访问的代码”(在带有/std:c++17的VC++15.8上)templateinlineboolMatchMonostate(VariantType&variant){SUPPRESS_C4100(variant);ifconstexpr(std::is_same_v){variant=std::monostate();returntrue;}returnfalse;//!!!unreachableiftheaboveistrue!!!=>C4702}为了抑制C4100的“未引用形式参数”警告,我已经在使用技巧了#defineSU
我有一个std::map使用自定义谓词:structPredIgnoreCase{booloperator()(conststd::string&str1,conststd::string&str2)const{std::stringstr1NoCase(str1),str2NoCase(str2);std::transform(str1.begin(),str1.end(),str1NoCase.begin(),tolower);std::transform(str2.begin(),str2.end(),str2NoCase.begin(),tolower);return(str1
我正在制作一个类——一个BST——它可以比较模板化节点,这需要一个比较器,例如std::less。树是这样的:templateclasstree{private:comparatorcompare;public:explicittree(comparatorfunctor);};但我似乎找不到应该在我的应用程序中输入哪种模板类型。treemy_bst(std::less);error:wrongnumberoftemplatearguments(1,shouldbe2)bst::treemy_bst(std::less);这是有道理的,因为我的模板类型不完整。我应该如何分析我的构造函数
std::experimental::source_location可能会在某个时候添加到C++标准中。我想知道是否有可能将位置信息获取到编译时领域。本质上,我想要一个在从不同源位置调用时返回不同类型的函数。像这样的东西,虽然它没有编译因为location对象不是constexpr因为它是一个函数参数:#includeusingnamespacestd::experimental;constexprautoline(constsource_location&location=source_location::current()){returnstd::integral_constant
当使用g++和clang++进行编译和链接时,期望生成的可执行文件的链接与它们的链接相同。然而,在某些情况下,尽管传入的参数相同,但clang++可执行文件似乎链接到比g++更多的库。这会导致功能差异,尤其是对于在加载和卸载时自动执行的动态链接库。为什么会这样? 最佳答案 事实证明,gcc在ubuntu--as-needed中默认启用了一项功能,这会导致gcc有效地忽略任何在链接项链中未引用其符号的库这可以在gcc中使用--no-as-needed标志禁用。或者,您可以发出-Wl,--as-needed作为clang++的第一个选项
我正在试验union,并将这个示例设为A类,其中包含匿名union成员。由于union包含一个std::string和一个std::vector我需要为该类定义一个析构函数。但是,当我尝试手动调用~string()时,我得到了union.cpp:Indestructor'A::~A()':union.cpp:14:14:error:expectedclass-namebefore'('tokens_.~string();我不明白这个vector。如果我删除对s._~string();的调用,它可以正常编译。这是编译器错误吗?我正在使用MinGW64。#include#includecl
以下代码无法编译,因为未找到比较运算符。#include#include#includenamespaceCool{structPerson{std::stringname;};}booloperator==(constCool::Person&p1,constCool::Person&p2){returnp1.name==p2.name;}intmain(int,char*[]){std::vectora{{"test"}};std::vectorb{{"test"}};boolok=a==b;std::cout经过一些实验,我发现以下代码可以完美编译:#include#includ